'use strict';

const { Service } = require('egg');
const ModelName = 'PvCoordinationRecord'
class RouterService extends Service {
  /**
   * 根据分页和搜索条件获取
   * @param {Object} where 查询用户的条件
   * @param {Number} page 当前分页
   * @param {Number} pageSize 当前页每页多少条
   */
  async getPage(where, page, pageSize) {
    return this.ctx.model[ModelName].findAndCountAll({
      where,
      offset: pageSize * (page - 1),
      limit: pageSize,
      order:[
        // id 降序
        ['name','ASC']
      ],
    });
  }

  // 所有列表
  async allList(where) {
    return this.ctx.model[ModelName].findAll({
      where,
      order:[
        // id 降序
        ['name','ASC']
      ],
    });
  }
  async findOne(id) {
    return this.ctx.model[ModelName].findOne({
      where: {
        id,
      },
    });
  }

  /**
   * 电网指令和实际光储差值
   * 低等级报警：光储调度值与电网指令之差的绝对值与差限之比超过40%。
   * 中等级报警：光储调度值与电网指令之差的绝对值与差限之比超过60%。
   * 高等级报警：光储调度值与电网指令之差的绝对值与差限之比超过80%。
   * grid_command: 电网指令
   * photovoltaic_dispatch_command: 光储调度值
   */
    async handleGridCommandAlarm(data) {
        let result = {
            level: '',
            message: ''
        }
        let diff = Math.abs(data.grid_command - data.photovoltaic_dispatch_command)
        let limit = 0
        if(diff > limit * 0.8) {
            result.level = '3'
            result.message = '光储调度值与电网指令之差的绝对值与差限之比超过80%'
        } else if(diff > limit * 0.6) {
            result.level = '2'
            result.message = '光储调度值与电网指令之差的绝对值与差限之比超过60%'
        } else if(diff > limit * 0.4) {
            result.level = '1'
            result.message = '光储调度值与电网指令之差的绝对值与差限之比超过40%'
        }
        if (result.level) {
            await this.ctx.model.Alarm.create({
                type: '5',
                bus_val: `电网指令：${data.grid_command}MW，光储调度值：${data.photovoltaic_dispatch_command}MW`,
                level: result.level,
                message: result.message
            })
        }
  }
  /**
   * 创建
   * @param {*} data 角色信息
   */
  async create(data) {
    // 实时数据
    if (data.type === 'realtime') {
        await this.handleGridCommandAlarm(data)
    }
    return this.ctx.model[ModelName].create(data);
  }

  /**
   * 根据ID修改
   * @param {Number} id ID
   * @param {Object} data 要修改的信息
   */
  async update(id, data) {
    return await this.ctx.model[ModelName].update(data, { where: { id } });
  }

  /**
   * 根据id删除
   * @param {Number}
   */
  async deleteById(id) {
    return await this.ctx.model[ModelName].destroy({ where: { id } });
  }
}

module.exports = RouterService;
